package br.com.bacabeleireiros.sysbeleza.controller;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;

import br.com.bacabeleireiros.sysbeleza.entity.Agenda;
import br.com.bacabeleireiros.sysbeleza.entity.Cliente;
import br.com.bacabeleireiros.sysbeleza.entity.FormaPagamento;
import br.com.bacabeleireiros.sysbeleza.entity.Produto;
import br.com.bacabeleireiros.sysbeleza.entity.VendaProduto;
import br.com.bacabeleireiros.sysbeleza.service.IAgendaService;
import br.com.bacabeleireiros.sysbeleza.service.ICaixaService;
import br.com.bacabeleireiros.sysbeleza.service.IClienteService;
import br.com.bacabeleireiros.sysbeleza.service.IFormaPagamentoService;
import br.com.bacabeleireiros.sysbeleza.service.IPagamentoService;
import br.com.bacabeleireiros.sysbeleza.service.IVendaProdutoService;
import br.com.bacabeleireiros.util.controller.BaseBean;

@ManagedBean(name = "pagamentoMB")
@ViewScoped
public class PagamentoMB extends BaseBean implements Serializable {

	private static final long serialVersionUID = 1L;
	private Cliente cliente;
	private Produto produto;
	private List<Agenda> pagamentoSelecionados;
	private List<VendaProduto> vendasSelecionadas;
	private Double valorRecebido;
	private Double troco;
	private List<FormaPagamento> listaFormaPagamento;
	private FormaPagamento formaPagamento;
	
	@ManagedProperty("#{agendaService}")
	private IAgendaService agendaService;
	
	@ManagedProperty("#{clienteService}")
	private IClienteService clienteService;		
	
	@ManagedProperty("#{pagamentoService}")
	private IPagamentoService pagamentoService;	
	
	@ManagedProperty("#{vendaProdutoService}")
	private IVendaProdutoService vendaProdutoService;
	
	@ManagedProperty("#{caixaService}")
	private ICaixaService caixaService;	
	
	@ManagedProperty("#{formaPagamentoService}")
	private IFormaPagamentoService formaPagamentoService;

	public PagamentoMB() {
		
	}
	
	@PostConstruct
	public void construct() {
		inicializa();
		
		String id = getFacesContext().getExternalContext().getRequestParameterMap().get("idCliente");
		if (!"".equals(id) && id != null) {
			cliente = clienteService.getById(Long.parseLong(id));
		}
		
		formaPagamento = new FormaPagamento();
		listaFormaPagamento = formaPagamentoService.getFormaPagamento();
	}	
	
	public void inicializa() {
		cliente = new Cliente();
		produto = new Produto();
		inicializaTotal();
	}
	
	public List<Agenda> getListaAgendaCliente() {
		return agendaService.getListaAgendaCliente(getCliente().getIdCliente());
	}
	
	public List<VendaProduto> getListaVendaProdutoCliente() {
		return vendaProdutoService.getListaVendaProdutoCliente(getCliente().getIdCliente());
	}	
	
	public List<Cliente> getListaClienteSelecionados() {
		String clienteSelelcionado = getCliente().getNome();
		if (clienteSelelcionado == null) {
			clienteSelelcionado = "";
		}
		return clienteService.getListaClienteSelecionados(clienteSelelcionado);
	}	
	
	public void inicializaTotal() {
		pagamentoSelecionados = new ArrayList<Agenda>();	
		vendasSelecionadas = new ArrayList<VendaProduto>();
		valorRecebido = new Double(0);
		troco = new Double(0);
	}
	
	public double getValorTotalServico() {
		double total = 0;
		for (Agenda a : getListaAgendaCliente()) {
			total += a.getValor();
		}
		return total;
	}
	
	public double getValorTotalVenda() {
		double total = 0;
		for (VendaProduto v : getListaVendaProdutoCliente()) {
			total += v.getValor() * v.getQuantidade();
		}
		return total;
	}	
	
	public double getValorTotalSelecionado() {
		return getValorTotalServicoSelecionado() + getValorTotalVendaSelecionado();
	}
	
	public double getValorTotalServicoSelecionado() {
		double total = 0;
		for (Agenda a : pagamentoSelecionados) {
			total += a.getValor();
		}
		return total;
	}	
	
	public double getValorTotalVendaSelecionado() {
		double total = 0;
		for (VendaProduto v : vendasSelecionadas) {
			total += v.getValor() * v.getQuantidade();
		}		
		return total;
	}	
	
	public void calculaTroco() {
		setValorRecebido(getValorRecebido()/100);
		setTroco(getValorRecebido() - getValorTotalSelecionado());
	}
	
	public void salvaPagamento() {
		if (getValorTotalSelecionado() <= 0) {
			addWarnMessage("Selecione um pagamento");	
		} else {
			getPaginaAtual().execute("PF('dlgConfirmaPagamento').show();");
		}
	}
	
	public void confirmaPagamento() {
		try {
			pagamentoService.efetuaPagamentoCaixaMovimento(getPagamentoSelecionados(),getValorTotalServicoSelecionado(),
					                                       getVendasSelecionadas(),getValorTotalVendaSelecionado(), 
					                                       caixaService.getCaixaAberto().getIdCaixa(),getFormaPagamento());
			inicializaTotal();
			addInfoMessage("Pagamento Finalizado com Sucesso"); 
		} catch (Exception e) {
			e.printStackTrace();	
			addErrorMessage("Erro ao Efetuar Pagamento.");
		}
	}
	
	public void carregaValorTotal() {
		pagamentoSelecionados = getListaAgendaCliente();
		vendasSelecionadas = getListaVendaProdutoCliente();
	}

	
	// gets e sets	
	public Cliente getCliente() {
		return cliente;
	}

	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}

	public void setAgendaService(IAgendaService agendaService) {
		this.agendaService = agendaService;
	}

	public void setClienteService(IClienteService clienteService) {
		this.clienteService = clienteService;
	}

	public List<Agenda> getPagamentoSelecionados() {
		return pagamentoSelecionados;
	}

	public void setPagamentoSelecionados(List<Agenda> pagamentoSelecionados) {
		this.pagamentoSelecionados = pagamentoSelecionados;
	}

	public double getValorRecebido() {
		return valorRecebido;
	}

	public void setValorRecebido(double valorRecebido) {
		this.valorRecebido = valorRecebido;
	}

	public double getTroco() {
		return troco;
	}

	public void setTroco(double troco) {
		this.troco = troco;
	}

	public void setPagamentoService(IPagamentoService pagamentoService) {
		this.pagamentoService = pagamentoService;
	}

	public Produto getProduto() {
		return produto;
	}

	public void setProduto(Produto produto) {
		this.produto = produto;
	}

	public void setVendaProdutoService(IVendaProdutoService vendaProdutoService) {
		this.vendaProdutoService = vendaProdutoService;
	}

	public List<VendaProduto> getVendasSelecionadas() {
		return vendasSelecionadas;
	}

	public void setVendasSelecionadas(List<VendaProduto> vendasSelecionadas) {
		this.vendasSelecionadas = vendasSelecionadas;
	}

	public void setCaixaService(ICaixaService caixaService) {
		this.caixaService = caixaService;
	}

	public List<FormaPagamento> getListaFormaPagamento() {
		return listaFormaPagamento;
	}

	public void setListaFormaPagamento(List<FormaPagamento> listaFormaPagamento) {
		this.listaFormaPagamento = listaFormaPagamento;
	}

	public void setFormaPagamentoService(
			IFormaPagamentoService formaPagamentoService) {
		this.formaPagamentoService = formaPagamentoService;
	}

	public FormaPagamento getFormaPagamento() {
		return formaPagamento;
	}

	public void setFormaPagamento(FormaPagamento formaPagamento) {
		this.formaPagamento = formaPagamento;
	}

	
}
